package org.jsola.hr.service;

import org.jsola.admin.dto.DictItemUpdateDTO;
import org.jsola.admin.entity.DictItemDO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISocProgDAO;
import org.jsola.hr.dto.IssuedSocProgAddDTO;
import org.jsola.hr.dto.SocProgAddDTO;
import org.jsola.hr.dto.SocProgUpdateDTO;
import org.jsola.hr.entity.EmpSocMonthDO;
import org.jsola.hr.entity.SocProgDO;
import org.jsola.hr.entity.SocProgItemDO;
import org.jsola.hr.query.SocProgQuery;
import org.jsola.hr.vo.SocProgListVO;
import org.jsola.hr.vo.SocProgVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 参保方案表
 *
 * @author zhr
 */
public interface ISocProgService extends IService<ISocProgDAO, SocProgDO> {

    /**
     * 新增参保方案表
     *
     * @param socProgAddDTO 新增参保方案表DTO
     * @param tokenUser     当前用户
     * @return 参保方案表详情信息
     */
    SocProgVO save(SocProgAddDTO socProgAddDTO, TokenUser tokenUser);

    /**
     * 批量新增参保方案表
     *
     * @param socProgAddDTOList 新增参保方案表DTO
     * @param tokenUser         当前用户
     * @return 参保方案表详情信息
     */
    List<SocProgVO> batchSave(List<SocProgAddDTO> socProgAddDTOList, TokenUser tokenUser);

    /**
     * 修改参保方案表
     *
     * @param socProgUpdateDTO 修改参保方案表DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(SocProgUpdateDTO socProgUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除参保方案表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param socProgIds 参保方案表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... socProgIds);

    /**
     * 根据参保方案表id查找
     *
     * @param socProgId 参保方案表id
     * @param siteId    所属站点id
     * @return 参保方案表详情信息
     */
    SocProgVO selectById(String socProgId, String siteId);

    /**
     * 根据参保方案表id查找
     *
     * @param socProgIds 参保方案表id
     * @param tokenUser  当前用户
     * @return 参保方案表详情信息
     */
    List<SocProgDO> selectByIds(List<String> socProgIds, TokenUser tokenUser);

    /**
     * 查询参保方案表
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案表列表信息
     */
    List<SocProgListVO> select(SocProgQuery socProgQuery, String siteId);

    /**
     * 查询参保方案表记录数
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案表记录数
     */
    int selectCount(SocProgQuery socProgQuery, String siteId);

    /**
     * 分页查询参保方案表
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案表列表信息
     */
    Page<SocProgListVO> selectPage(SocProgQuery socProgQuery, String siteId);


    /**
     * 根据参保方案表id查找
     *
     * @param socProgId 参保方案表id
     * @param siteId    所属站点id
     * @return 参保方案表
     */
    SocProgDO selectDOById(String socProgId, String siteId);

    /**
     * 查询参保方案表
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案表列表
     */
    List<SocProgDO> selectDO(SocProgQuery socProgQuery, String siteId);

    /**
     * 分页查询参保方案相关
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案表列相关
     */
    Page<SocProgListVO> pageRelation(SocProgQuery socProgQuery, String siteId);

    /**
     * 查询参保方案相关
     *
     * @param progId    参保方案ID
     * @param tokenUser 登录用户
     * @return 参保方案相关
     */
    SocProgVO findSocProgRelation(String progId, TokenUser tokenUser);

    /**
     * 分页查询参保方案相关
     *
     * @param socProgQuery 查询条件
     * @param siteId       所属站点id
     * @return 参保方案相关
     */
    List<SocProgListVO> listAllRelation(SocProgQuery socProgQuery, String siteId);

    /**
     * 根据参保方案名获取参保方案
     *
     * @param socProgName 方案名称
     * @param socCityName 参保城市名称
     * @param siteId      站点
     * @return 参保方案
     */
    SocProgDO findSocProgByName(String socProgName, String socCityName, String siteId);

    /**
     * 查询公司下的参保方案
     *
     * @param companyId 公司Id
     * @param tokenUser 站点
     * @return 参保方案列表
     */
    List<SocProgDO> selectSocProgByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 获取用工单位下的所有方案名称
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 方案名称
     */
    List<String> getSchemeNameByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 下发参保方案到公司
     *
     * @param issuedSocProgAddDTO 参保方案
     * @param tokenUser           登录用户
     * @return 参保方案
     */
    List<SocProgVO> saveIssuedSocProg(IssuedSocProgAddDTO issuedSocProgAddDTO, TokenUser tokenUser);

    /**
     * 根据Id列表查询
     *
     * @param idList    id列表
     * @param tokenUser 当前用户
     * @return 参保月
     */
    List<SocProgDO> selectByIdList(List<String> idList, TokenUser tokenUser);


    /**
     * 根据参保方案名称查询参保方案
     *
     * @param socProgName 参保方案名称
     * @param companyId   公司Id
     * @param siteId      站点
     * @return 参保方案
     */
    SocProgDO selectSocProgByName(String socProgName, String companyId, String siteId);

    /**
     * 根据参保记录的所有子项列表的类型查询拥有这些类型的方案
     *
     * @param empSocInfoId 参保记录Id
     * @param companyId    公司Id
     * @param tokenUser    当前用户
     * @return 参保方案列表
     */
    List<String> selectSchemeByEmpSocInfoId(String empSocInfoId, String companyId, TokenUser tokenUser);

    /**
     * 根据员工查询这个员工最近一个月使用的参保方案
     *
     * @param empId     员工id
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 参保方案
     */
    SocProgVO selectSchemeByEmpRelated(String empId, String companyId, TokenUser tokenUser);

    /**
     * 查询公司下所有方案的子项
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 子项列表
     */
    List<SocProgItemDO> selectItemNameByCompany(String companyId, TokenUser tokenUser);

    /**
     * 花名册添加员工字段时校验是否和公司下社保子项重复
     *
     * @param companyId 公司Id
     * @param itemName  子项姓名
     * @param tokenUser 当前用户
     * @return 是否重复
     */
    Boolean checkEmpItemName(String companyId, String itemName, TokenUser tokenUser);

    /**
     * 根据名称列表查询方案
     *
     * @param nameList  名称列表
     * @param companyId 公司Id
     * @param siteId    所属站点id
     * @return 参保方案表列表信息
     */
    List<SocProgDO> selectByNameList(List<String> nameList, String companyId, String siteId);

    /**
     * 更新账号
     *
     * @param dictItem  dict(修改前)
     * @param update    update(修改后)
     * @param tokenUser 当前用户
     */
    void updateDict(DictItemDO dictItem, DictItemUpdateDTO update, TokenUser tokenUser);

    /**
     * 删除对应账号
     *
     * @param dictItem  dice
     * @param tokenUser 当前用户
     */
    void deleteDict(DictItemDO dictItem, TokenUser tokenUser);
}


